package com.blog.cmrpersonalblog.dto.ranking.respnose;

import com.blog.cmrpersonalblog.common.PageResult;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 榜单响应DTO
 * 继承 PageResult 以复用分页字段
 */
@Data
@EqualsAndHashCode(callSuper = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class RankingResponse extends PageResult<RankingItemResponse> {

    /**
     * 榜单类型
     */
    private String rankingType;

    /**
     * 榜单类型名称
     */
    private String rankingTypeName;

    /**
     * 榜单维度
     */
    private String dimension;

    /**
     * 榜单维度名称
     */
    private String dimensionName;

    /**
     * 分类ID（分类榜时有值）
     */
    private Long categoryId;

    /**
     * 分类名称（分类榜时有值）
     */
    private String categoryName;

    /**
     * 榜单更新时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;

    /**
     * 下次更新时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime nextUpdateTime;

    /**
     * 创建分页响应
     */
    public static RankingResponse create(List<RankingItemResponse> items, Long total, Long current, Long size) {
        RankingResponse response = new RankingResponse();
        response.setRecords(items);
        response.setTotal(total);
        response.setCurrent(current);
        response.setSize(size);
        response.setPages((total + size - 1) / size);
        response.setHasNext(current < response.getPages());
        response.setHasPrevious(current > 1);
        return response;
    }

    /**
     * 创建简单列表响应（不分页）
     */
    public static RankingResponse createList(List<RankingItemResponse> items) {
        RankingResponse response = new RankingResponse();
        response.setRecords(items);
        response.setTotal((long) items.size());
        response.setCurrent(1L);
        response.setSize((long) items.size());
        response.setPages(1L);
        response.setHasNext(false);
        response.setHasPrevious(false);
        return response;
    }

    /**
     * 获取榜单项列表（兼容旧代码）
     * 使用 @JsonIgnore 避免序列化时重复输出 items 和 records 字段
     */
    @JsonIgnore
    public List<RankingItemResponse> getItems() {
        return getRecords();
    }

    /**
     * 设置榜单项列表（兼容旧代码）
     */
    @JsonIgnore
    public void setItems(List<RankingItemResponse> items) {
        setRecords(items);
    }
}

